using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
    [Header("Controls")]
    public float speed = 7f;
    private float moveX; // Перемещение по горизонтали
    private float moveY; // Перемещение по вертикали
    public bool facingRight = true;

    private Rigidbody2D rb;
    public BulletW4 bulletW4; // Ссылка на компонент пули
    private Animator anim; // Переменная для аниматора
    public int health = 10; // Переменная здоровья
    [HideInInspector] public int score = 0;
    [HideInInspector] public int highscore = 0;

    [Header("Bonuses")]
    [SerializeField] private GameObject poisonEffect; // Эффект подбора аптечки
    [SerializeField] public GameObject shield; // Щит
    [SerializeField] public Shield shieldTimer;

    [Header("Canvas")]
    [SerializeField] public Text healthDisplay;
    [SerializeField] public Text textScore;
    [SerializeField] public Text textHighscore;

    private void Start() {
        // Получение компонентов игрока
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        highscore = PlayerPrefs.HasKey("highscore") ? PlayerPrefs.GetInt("highscore") : 0;
    }

    // private void FixedUpdate() {
    //     moveX = Input.GetAxis("Horizontal");
    //     moveY = Input.GetAxis("Vertical");

    //     // Установление скорости игрока по двум направлениям
    //     float correction = (moveX != 0 && moveY != 0) ? Mathf.Sqrt(2) : 1f;
    //     rb.velocity = new Vector2(moveX * speed / correction, moveY * speed / correction);

    //     // Если игрок начинает двигаться в противоположном направлении, разворачиваем игрока 
    //     if((facingRight == false && moveX > 0) || (facingRight == true && moveX < 0)) Flip();
    //     anim.SetBool("isRunning", !(moveX == 0 && moveY == 0)); // Управление анимацией бега
    // }

    private void Update() {

        if (gameObject.CompareTag("Player")) { // Обработка движения игрока при однопользовательском режиме
            float horizontal = Input.GetAxis("Horizontal");
            float vertical   = Input.GetAxis("Vertical");

            Vector2 movement = new Vector2((Input.GetKey("d") ? 1f : Input.GetKey("a") ? -1f : 0f), 
                (Input.GetKey("w") ? 1f : Input.GetKey("s") ? -1f : 0f)) * speed * Time.deltaTime;
            transform.Translate(movement);

            // Если игрок начинает двигаться в противоположном направлении, разворачиваем игрока (в данном случае работает только WASD)
            if((facingRight == false && Input.GetKey("d")) || (facingRight == true && Input.GetKey("a"))) Flip();
            anim.SetBool("isRunning", !(horizontal == 0 && vertical == 0) 
                && (Input.GetKey("d") || Input.GetKey("w") || Input.GetKey("a") || Input.GetKey("s"))); // Управление анимацией бега  
        }   
      
        if (gameObject.CompareTag("SecondPlayer")) { // Обработка движений второго игрока при многопользовательском режиме
            float horizontal = Input.GetAxis("Horizontal");
            float vertical   = Input.GetAxis("Vertical");

            Vector2 movement = new Vector2((Input.GetKey(KeyCode.RightArrow) ? 1f : Input.GetKey(KeyCode.LeftArrow) ? -1f : 0f), 
                (Input.GetKey(KeyCode.UpArrow) ? 1f : Input.GetKey(KeyCode.DownArrow) ? -1f : 0f)) * speed * Time.deltaTime;
            transform.Translate(movement);

            // Если игрок начинает двигаться в противоположном направлении, разворачиваем игрока (в данном случае работает только WASD)
            if((facingRight == false && Input.GetKey(KeyCode.RightArrow)) 
                || (facingRight == true  && Input.GetKey(KeyCode.LeftArrow))) Flip();
            anim.SetBool("isRunning", !(horizontal == 0 && vertical == 0) // Управление анимацией бега 
                && (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.DownArrow)));   
        }

        // Перезагрузка сцены после смерти
        if (health <= 0) {
            PlayerPrefs.SetInt("result", score);
            PlayerPrefs.SetString("endGame", "lost");
            SceneManager.LoadScene("DeathMenu");
        }
        if (PlayerPrefs.GetInt("highscore") < score) {
            PlayerPrefs.SetInt("highscore", score);
        }
        if (!PlayerPrefs.HasKey("highscore")) {
            PlayerPrefs.SetInt("highscore", 0);
        }
        if (gameObject.CompareTag("Player"))
            textHighscore.text = "HIGHSCORE: " + PlayerPrefs.GetInt("highscore");

    }

    // Разворот игра на 180 градусов по горизонтали
    private void Flip() {
        facingRight = !facingRight;
        Vector3 Scaler = transform.localScale;
        Scaler.x *= -1;
        transform.localScale = Scaler;
    }

    // Подбор бонуса
    private void OnTriggerEnter2D(Collider2D other) {
        if (other.CompareTag("poison")) { 
            ChangeHealth(5);
            Instantiate(poisonEffect, other.transform.position, Quaternion.identity);
            Destroy(other.gameObject);
        }
        else if (other.CompareTag("shield")) { // Подбор щита
            if (!shield.activeInHierarchy) {
                shield.SetActive(true); // Активация щита
                shieldTimer.gameObject.SetActive(true); // Утсановка таймера
                shieldTimer.isCooldown = true;
                Destroy(other.gameObject);
            } else {
                shieldTimer.ResetTimer();
                Destroy(other.gameObject);
            }
        }
    }

    public void ChangeHealth(int healthValue) { // Изменение здоровья
        if (!shield.activeInHierarchy || shield.activeInHierarchy && healthValue > 0) {
            health += healthValue;
            healthDisplay.text = "HP: " + health; // Отображение текущего здоровья на экране
        } else if (shield.activeInHierarchy && healthValue < 0) {
            shieldTimer.ReduceTimer(healthValue); // Уменьшение времени действия щита при нанесении урона
        }

    }
}
